package Agentes;

import Objetos.*;

import java.io.*;

import jade.core.*;
import jade.core.behaviours.*;
import jade.lang.acl.*;
import jade.domain.FIPAAgentManagement.ServiceDescription;
import jade.domain.FIPAAgentManagement.DFAgentDescription;
import jade.domain.DFService;
import jade.domain.FIPAException;
import jade.content.lang.*;
import jade.content.lang.sl.*;
import jade.content.onto.*;

public class Gobierno extends Agent {
	//
	private Codec codec = new SLCodec();
	private Ontology ontologia = LicenciasOntologias.getInstance();

	protected void setup() {

		System.err.println("***********************************");
		System.err.println("Setup Gobierno");
		System.err.println("***********************************");
		
		/** Registrarse en el DF */
		DFAgentDescription dfd = new DFAgentDescription();
		ServiceDescription sd = new ServiceDescription();
		sd.setType("Gobierno");
		sd.setName(getName());
		dfd.setName(getAID());
		dfd.addServices(sd);
		try {
			DFService.register(this, dfd);
		} catch (FIPAException e) {
			System.err.println(getLocalName()
					+ " registration with DF unsucceeded. Reason: "
					+ e.getMessage());
			doDelete();
		}

		getContentManager().registerLanguage(codec);
		getContentManager().registerOntology(ontologia);

		
		
		addBehaviour(new Inicilaizar());
		addBehaviour(new LicenciarConstruccionCentroTrabajo());
		addBehaviour(new LicenciarConstruccionResidencia());
		
		
		

		addBehaviour(new TickerBehaviour(this, 5000) {
			public void onTick() {
				ACLMessage reply = myAgent.receive();
				if (reply != null) {
					if(reply.getSender().getName().substring(0,reply.getSender().getName().indexOf('@')).equals("EV1")){
					//int respu = Integer.parseInt(reply.getContent());
					//if (respu == 100) {
						// Verifico que si sea del Evaluador el mensaje que
						// tenga en la bandeja
						addBehaviour(new LicenciarConstruccionCentroTrabajo());
						addBehaviour(new LicenciarConstruccionResidencia());
					}
				}
			}
		});
	}

	protected void takeDown() {
		try {
			DFService.deregister(this);
		} catch (FIPAException fe) {
			fe.printStackTrace();
		}
		System.out
				.println("La ciudad no tiene mas AHORRO para crecer ni sostenerce ... Finalizando");
	}

	public class LicenciarConstruccionResidencia extends OneShotBehaviour {

		public void action() {
			System.err.println("***********************************");
			System.err.println("LicenciarConstruccionResidencia");
			System.err.println("***********************************");			
			
			long personasE = Indicadores.personas - Indicadores.personasDesempleadas;
			long personasEA = personasE - Indicadores.personasArriendos;
			long ahorro = Indicadores.ahorro;

			
			//if ((personasEA / 15) > Indicadores.residencias && ahorro > 700) {
				
				// Expide Licencia y envia mensaje a ConstructorResidencia
				try {
					BufferedReader buff = new BufferedReader(new InputStreamReader(System.in));
					String respuesta = "CR1";
					AID r = new AID();
					r.setLocalName(respuesta);

					ACLMessage msg = new ACLMessage(ACLMessage.INFORM);
					msg.setSender(getAID());
					msg.addReceiver(r);
					msg.setLanguage(codec.getName());
					msg.setOntology(ontologia.getName());

					Licencia lic = new Licencia();
					lic.setTipo(2);
					
					lic.setSerial((int)(Math.random()*100));

					Expedir exp = new Expedir();
					exp.setLicencia(lic);

					getContentManager().fillContent(msg, exp);
					send(msg);

				} catch (jade.content.lang.Codec.CodecException ce) {
					System.out.println(ce);
				} catch (jade.content.onto.OntologyException oe) {
					System.out.println(oe);
				} catch (Exception e) {
					System.out.println("\n\n... Terminando ...");
					
				//}

			}
		}
	}

	public class LicenciarConstruccionCentroTrabajo extends OneShotBehaviour {

		public void action() {
			
			System.err.println("***********************************");
			System.err.println("LicenciarConstruccionCentroTrabajo");
			System.err.println("***********************************");
			
			long personasD = Indicadores.personasDesempleadas;
			long ahorro = Indicadores.ahorro;

			//if (personasD >= 50 && ahorro > 10000) {
				
				// Expide Licencia y envia mensaje a ConstructorCentroTrabajo
				try {
					BufferedReader buff = new BufferedReader(new InputStreamReader(System.in));
					String respuesta = "CT1";
					AID r = new AID();
					r.setLocalName(respuesta);

					ACLMessage msg = new ACLMessage(ACLMessage.INFORM);
					msg.setSender(getAID());
					msg.addReceiver(r);
					msg.setLanguage(codec.getName());
					msg.setOntology(ontologia.getName());

					Licencia lic = new Licencia();
					lic.setTipo(1);
					lic.setSerial((int)(Math.random()*100));

					Expedir exp = new Expedir();
					exp.setLicencia(lic);

					getContentManager().fillContent(msg, exp);
					send(msg);

				} catch (jade.content.lang.Codec.CodecException ce) {
					System.out.println(ce);
				} catch (jade.content.onto.OntologyException oe) {
					System.out.println(oe);
				} catch (Exception e) {
					System.out.println("\n\n... Terminando ...");
					
				}

			}
			
		//}

	}

	public class Inicilaizar extends OneShotBehaviour {
		public void action() {
			System.err.println("***********************************");
			System.err.println("Inicilaizar");
			System.err.println("***********************************");
			
			Indicadores.ahorro = 1000000;
			
			CentroTrabajo nuevoCentro1 = new CentroTrabajo();
			CentroTrabajo nuevoCentro2 = new CentroTrabajo();

			
			Indicadores.suelos[100][100].tipo = 3; //Pasa a ser Urbano
			Indicadores.suelos[100][100].construccion = nuevoCentro1;
			Indicadores.centros++;
			
			Indicadores.suelos[50][150].tipo = 3; //Pasa a ser Urbano
			Indicadores.suelos[50][150].construccion = nuevoCentro2;
			Indicadores.centros++;
			
			
			for(int i=0; i<170; i++)
				Indicadores.poblacion.add(new Persona());
			
			Indicadores.personas = 170;
			Indicadores.personasArriendos = 125;
			Indicadores.personasDesempleadas = 125;
			
			for(int i=0; i<3; i++){
				Residencia nuevaResidencia = new Residencia();
				for(int j=0; j<15; j++){
					Indicadores.poblacion.get(j + 15*i).arriendo = false;
					Indicadores.poblacion.get(j + 15*i).residencia = nuevaResidencia;
					Indicadores.poblacion.get(j + 15*i).ahorro = 300;
				}
				int aleatorioX = (int)(Math.random()*200);
				int aleatorioY = (int)(Math.random()*200);
				Indicadores.suelos[aleatorioX][aleatorioY].tipo = 3;
				Indicadores.suelos[aleatorioX][aleatorioY].construccion = nuevaResidencia;
			}
			
			Indicadores.residencias = 3;
			
			
			/************************************************************************************/
			int xProtegidos = (int)(200 * 0.15);
			int yProtegidos = (int)(200 * 0.15);
			
			//Se rellena el 15% del Grid con Suelo Protegido
			for(int i=0; i < xProtegidos; i++)
			{
				for(int j=0; j < yProtegidos; j++)
				{
						int aleatorioX = (int)(Math.random()*200 );
						int aleatorioY = (int)(Math.random()*200 );
						if(Indicadores.suelos[aleatorioX][aleatorioY].tipo == 2)
							Indicadores.suelos[aleatorioX][aleatorioY].tipo = 1;
				}
			}
			/************************************************************************************/
			for(int i=0; i < 200; i++)
			{
				for(int j=0; j < 200; j++)
				{
					double distancia = Math.sqrt( Math.pow((i-100),2) + Math.pow(j-100, 2));
					distancia += Math.sqrt( Math.pow((i-50),2) + Math.pow(j-150, 2)); 
					Indicadores.suelos[i][j].distancia = distancia;;
				}
			}
			
				//Distancias y Densidad
			
			/************************************************************************************/
		}
	}

}